package sql.ddl.coluna;

import sql.ddl.Tabela;

final public class ColunaComposta extends Coluna {
	Tabela tipoReferencia = null;

	Coluna[] colunas = null;

	ForeignKey foreignKey;

	public ColunaComposta(Tabela tabelaReferencia, String nome,
			Coluna... colunas) throws Exception {
		super(tabelaReferencia.getNome(), nome);
		tipoReferencia = tabelaReferencia;
		this.colunas = colunas.length == 0 ? montaPkDefault(nome) : colunas;
		foreignKey = new ForeignKey(this.tipoReferencia, this.colunas);
	}

	public ColunaComposta(Tabela tabelaReferencia, String nome,
			String aliasForeignkey, Coluna... colunas) throws Exception {
		this(tabelaReferencia, nome, colunas);
		foreignKey.setConstraint(aliasForeignkey);
	}

	private Coluna[] montaPkDefault(String nome) {
		return new Coluna[] { (nome == null ? criarDefaultColunm(tipoReferencia
				.getNome()) : criarDefaultColunm(nome)) };
	}

	private Coluna criarDefaultColunm(String nome) {
		return new sql.ddl.coluna.types.Int4(FK + maxPrimeiraLetra(nome),
				"NOT NULL");
	}

	private String maxPrimeiraLetra(String nome) {
		return nome.length() > 0 ? nome.substring(0, 1).toUpperCase()
				+ nome.substring(1) : nome;
	}

	public String codigoSQL() throws Exception {
		String sql = NONVALUE;
		sql = lerRegistro(colunas[0]);
		for (int i = 1; i < colunas.length; i++) {
			sql = VIRGUL + SPACE + lerRegistro(colunas[i]);
		}
		return sql;
	}

	private String lerRegistro(Coluna coluna) {
		try {
			return coluna.codigoSQL();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public ListaColuna getChaves() {
		ListaColuna l = new ListaColuna();
		for (Coluna coluna : colunas)
			l.add(coluna);
		return l;

	}

	public String nomeColunas() {
		String s = colunas[0].getNome();
		for (int i = 1; i < colunas.length; i++)
			s += VIRGUL + colunas[i].getNome();
		return s;
	}

	public Tabela getTabela() {
		return tipoReferencia;
	}

	public ForeignKey getForeignKey() {
		return foreignKey;
	}

	public void setAliasForeignkey(String aliasForeignKey) {
		foreignKey.setConstraint(aliasForeignKey);
	}
}
